1、 Framebuffer 驱动程序框架
	Framebuffer 驱动程序框架包括两个部分：
	1）通用框架部分，承上启下，向上为应用层提供接口，向下抽象出 LCD 操作接口，这部分内容有 Linux 内核实现
	2） LCD 设备驱动部分，用于驱动具体的 LCD ，这部分内容是驱动开发人员主要关心的内容
2、 编写 Framebuffer 驱动的步骤
	1）模块加载
		a） 使用 framebuffer_alloc 分配 struct fb_info
		b） 初始化 struct fb_info，主要包括显存、可变参数、不可变参数、操作函数集合、颜色表等
		c） 使用 register_framebuffer 注册 struct fb_info
	2）模块卸载
		a） 使用 unregister_framebuffer 注销 struct fb_info
		b） 使用 framebuffer_release 释放 struct fb_info
4、 相关的数据结构
	1）struct fb_info 用于描述一个 framebuffer 设备，其核心成员如下：
		/* fb的可变参数 */
		struct fb_var_screeninfo var;
		/* fb的不可变参数 */
		struct fb_fix_screeninfo fix;
		/* 该fb设备对应的操作方法 */
		struct fb_ops *fbops;
		/* 这个就是我们的LCD的显存地址(虚拟地址) */
		char __iomem *screen_base;
		/* LCD显存的字节大小 */
		unsigned long screen_size;
		/* 颜色表 */
		void *pseudo_palette;
	2）struct fb_var_screeninfo 用于描述 LCD 的可变参数，其核心成员如下：
		/* 水平分辨率 */
		__u32 xres;
		/* 垂直分辨率 */
		__u32 yres;
		/* 虚拟水平分辨率 */
		__u32 xres_virtual;
		/* 虚拟垂直分辨率 */
		__u32 yres_virtual;
		/* 当前显存水平偏移量 */
		__u32 xoffset;
		/* 当前显存垂直偏移量 */
		__u32 yoffset;
		/* 像素深度，即每个像素的位数 */
		__u32 bits_per_pixel;
		//红、绿、蓝、透明在像素中的位偏移及位数 */
		struct fb_bitfield red;
		struct fb_bitfield green;
		struct fb_bitfield blue;
		struct fb_bitfield transp;
		/* LCD的物理高度mm */
		__u32 height;
		/* LCD的物理宽度mm */
		__u32 width;
		/* LCD的时序参数 */
		__u32 pixclock;            /* pixel clock in ps (pico seconds) */
		__u32 left_margin;         /* time from sync to picture */
		__u32 right_margin;        /* time from picture to sync */
		__u32 upper_margin;        /* time from sync to picture */
		__u32 lower_margin;
		__u32 hsync_len;           /* length of horizontal sync */
		__u32 vsync_len;           /* length of vertical sync */
	3）struct fb_fix_screeninfo 用于描述 LCD 的不可变参数，其核心成员如下：
		//识别字符串
		char id[16];
		/* LCD显存的起始地址(物理地址) */
		unsigned long smem_start;
		/* LCD显存的大小（byte） */
		__u32 smem_len;
		/**
		 * 类型
		 * FB_TYPE_PACKED_PIXELS： 紧缩像素格式（最常见的一种格式），像素被连续地存放在一个平面中
		 * FB_TYPE_PLANES： 非间隔平面格式，像素中的各分量被分离地存放在不同的平面中，平面的个数等于像素的有
		 *                  效位数
		 * FB_TYPE_INTERLEAVED_PLANES： 间隔平面格式，像素中的各分量被分离地存放在不同平面中，平面的个数等于
		 *                              像素的有效位数，只是每个平面在内存中并不连续
		 * FB_TYPE_TEXT： 文本模式，有的显示设备支持直接文本显示
		 * FB_TYPE_VGA_PLANES： EGA/VGA 格式
		 **/
		__u32 type;
		/**
		* 颜色
		* FB_VISUAL_MONO01： 黑白像素，0=白 1=黑
		* FB_VISUAL_MONO02： 黑白像素，0=黑 1=白
		* FB_VISUAL_TRUECOLOR： 真彩色，每个像素值直接是RGB分量
		* FB_VISUAL_PSEUDOCOLOR： 伪彩色，像素值作为索引到调色板里获取显示的RGB值；
		* FB_VISUAL_DIRECTCOLOR：直接色，RGB分量分别作为索引到分别的调色板中查找出对应的RGB颜色；
		* FB_VISUAL_STATIC_PSEUDOCOLOR：只读的伪彩色；
		**/
		__u32 visual;
		/* LCD一行的长度（byte） */
		__u32 line_length;
	3）struct fb_ops 为该fb设备对应的操作方法，其核心成员如下：
		/* 指向当前模块 */
		struct module *owner;
		/* 设置颜色表 */
		int (*fb_setcolreg)(unsigned regno, unsigned red, unsigned green,
					unsigned blue, unsigned transp, struct fb_info *info);
		/* 开启或关闭显示 */
		int (*fb_blank)(int blank, struct fb_info *info);
		/* 绘制矩形 */
		void (*fb_fillrect) (struct fb_info *info, const struct fb_fillrect *rect);
		/* 将数据从一个区域复制到另一个区域 */
		void (*fb_copyarea) (struct fb_info *info, const struct fb_copyarea *region);
		/* 绘制图像 */
		void (*fb_imageblit) (struct fb_info *info, const struct fb_image *image);
		/* 旋转屏幕 */
		void (*fb_rotate)(struct fb_info *info, int angle);
		/* 映射缓冲帧 */
		int (*fb_mmap)(struct fb_info *info, struct vm_area_struct *vma);
3、 Framebuffer 应用开发
	1）打开设备文件 /dev/fb0
	2）获取 framebuffer 设备信息
		a）不可变信息FSCREENINFO，使用ioctl的FBIOGET_FSCREENINFO命令（比如屏幕大小）
		b）可变信息VSCREENINFO，使用ioctl的FBIOGET_VSCREENINFO名（比如屏幕分辨率）
	3）使用 mmap 对显存做映射
	4）读写显存
